package com.example.nettyserver.netty;

/**
 * Created with IntelliJ IDEA.
 *
 * @author : zjs
 * @Date: 2021/4/29 18:06
 * Description:
 */

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * netty服务端处理器
 **/
@Slf4j
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
    //自定义分割符用来返回
    private final String cmd = "%010d";

    /**
     * 客户端连接会触发
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        log.info("Channel active......");
    }

    /**
     * 客户端发消息会触发
     */
    @Override
    public void channelRead(final ChannelHandlerContext ctx, Object msg) throws Exception {
        //ChannelHandlerContext是上下文对象，含有管道pipeline,通道channel

        log.info("服务器收到消息: {}", msg.toString());
        //1.用户自定义的普通任务
        ctx.channel().eventLoop().execute(new Runnable() {
            @Override
            public void run() {
                try {
                    //逻辑处理

                    //先返回channelReadComplete方法的数据给客户端，然后任务阻塞完成后返回以下信息
                    ctx.writeAndFlush(Unpooled.copiedBuffer("你也好哦 , 阻塞10秒" + cmd, CharsetUtil.UTF_8));

                } catch (Exception e) {
                    e.printStackTrace();
                    ctx.writeAndFlush(Unpooled.copiedBuffer("服务端处理数据失败" + cmd, CharsetUtil.UTF_8));
                }

            }
        });

        //2 用户自定义定时任务 任务提交到scheduleTaskQueue
/*        ctx.channel().eventLoop().schedule(new Runnable() {
            @Override
            public void run() {
                try {
                    ctx.writeAndFlush(Unpooled.copiedBuffer("执行200", CharsetUtil.UTF_8));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }, 5, TimeUnit.SECONDS);*/
//3普通
//            ctx.writeAndFlush("你也好哦" + cmd);
//            ctx.writeAndFlush(Unpooled.copiedBuffer("你也好哦"+cmd,  CharsetUtil.UTF_8));

    }


    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        //write加Flush方法，将数据写入缓存并刷新
        //对发送的数据进行编码
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello,客户端,服务器已接收到数据" + cmd, CharsetUtil.UTF_8));
    }

    /**
     * 发生异常触发
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}
